夺宝奇兵 [思维题]
夺宝奇兵 [思维题]
Wannafly Day 3 A
题目来源:comet OJ
分析
这道题的关键在于依次从\(1\)到\(n\)然后从\(n\)到\(1\)。我们只考虑从\(i\)到\(i+1\)的情况,因为我们可以发现不同的\(i\)之间是不会相互干扰的,那么:当我们的\(i\)已确定时,我们只需要选择距离最近的\(i+1\)即可。但我们要令\(i\)到\(i+1\)和后来的从\(i+1\)回到\(i\)的距离之和最小,那么只需要组合一下,取和最小的情况即可。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include <iostream> #include <algorithm>
#define MAXN 100100
using namespace std;
int x[MAXN][2], y[MAXN][2];
int calc(int i, int j) { if (j) return abs(x[i+1][0] - x[i][0]) + abs(x[i+1][1] - x[i][1]) + abs(y[i+1][0] - y[i][0]) + abs(y[i+1][1] - y[i][1]); else return abs(x[i+1][0] - x[i][1]) + abs(x[i+1][1] - x[i][0]) + abs(y[i+1][0] - y[i][1]) + abs(y[i+1][1] - y[i][0]); }
int main() { int n, m; cin >> n >> m;
for (int i = 1; i<=n; i++) { cin >> x[i][0] >> y[i][0]; cin >> x[i][1] >> y[i][1]; }
long long ans = 0; for (int i = 1; i<n; i++) ans += min( calc(i,0), calc(i,1) );
ans += abs(x[n][0] - x[n][1]) + abs(y[n][0] - y[n][1]);
cout << ans << endl; }
|